#ifndef DATA_H
#define DATA_H

#include <QString>
#include <QStringList>
#include <QList>
#include <QPair>
#include <QTextStream>

namespace Data {        // 该名字空间负责处理数据

    class Favorability {        // Favorability类是一个好感度表
    public:
        Favorability() { }
        explicit Favorability(QTextStream& message) { init(message); }
        void please(const QStringList& name);       // 讨好若干个女主
        QStringList select(const Favorability& judge) const;        // 判断进入谁的路线
        Favorability operator+(const Favorability& other) const;        // 加法
        void operator+=(const Favorability& other);     // 加法
        QStringList roles() const;      // 女主们的姓名
        int operator[](const QString& name) const;      // 这位女主的好感度
    private:
        QList<QPair<QString,int>> loves;
        void init(QTextStream& message);        // 用指定女主信息初始化好感度表
        void please(const QPair<QString,int>& love);        // 讨好某个女主若干次
    };

    class Road {        // Road类是一条路线
    public:
        Road(const QString& option, const QStringList& favors) : options{option} { loves.please(favors); }
        Road operator+(const Road& other) const;        // 加法
        const Favorability& favors() const { return loves; }
        const QStringList& get_options() const { return options; }
    private:
        QStringList options;
        Favorability loves;
    };

    class Roads {       // Roads类表示讨好同一组（败犬）女主的一组路线
    public:
        explicit Roads(const QStringList& loser) : loser{loser} { }
        bool use_road(const QStringList& names, const Road& road);      // 若names是同一组女主，就添加road，返回是否成功添加
        const QList<Road>& road() const { return roads; }
        const QStringList& names() const { return loser; }
    private:
        QStringList loser;
        QList<Road> roads;
    };

    class Female_lead {     // Female_lead类是一个柚子社女主
    public:
        explicit Female_lead(const QString& name) : name{name} { }
        bool my_road(const QStringList& loves) const { return loves.first()==name; }
        void add_road(const QStringList& loser, const Road& road);      // 保存一条通往本女主的路线。loser是被本女主击败的败犬们
        bool operator==(const QString& nm) const { return name==nm; }
        const QList<Roads>& road_list() const { return roads; }
    private:
        QString name;
        QList<Roads> roads;
    };

}

#endif // DATA_H
